package com.flot.yazb.base.rxjava;

import android.graphics.Bitmap;
import android.util.Log;

import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

/**
 * RxJava 提供了对事件序列进行变换的支持，这是它的核心功能之一，也是大多数人说『RxJava 真是太好用了』的最大原因。所谓变换，就是将事件序列中的对象或整个序
 * 列进行加工处理，转换成不同的事件或事件序列
 * Created by fengdongfei on 2017/8/27.
 */

public class RxChange {

    // map() 方法将参数中的 String 对象转换成一个 Bitmap 对象后返回，而在经过 map() 方法后，事件的参数类型也由 String 转为了 Bitmap。这种直接变换对象并返
    // 回的，是最常见的也最容易理解的变换。不过 RxJava 的变换远不止这样，它不仅可以针对事件对象，还可以针对整个事件队列，这使得 RxJava 变得非常灵活
    // -->是一对一的转化
    public void bitmap_map(){
        Observable.just("images/logo.png") // 输入类型 String
                .map(new Func1<String, Bitmap>() {
                    @Override
                    public Bitmap call(String filePath) { // 参数类型 String
//                        return getBitmapFromPath(filePath); // 返回类型 Bitmap
                        return null;
                    }
                })
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) { // 参数类型 Bitmap
//                        showBitmap(bitmap);
                    }
                });
    }


    private void printStuName_map() {
        String[] students = {"1", "2"};
        Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String name) {
            }

        };
        Observable.from(students)
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String student) {
                        return student;
                    }
                })
                .subscribe(subscriber);
    }


    //flatMap():事件对象的直接变换--->是一对多的转化
    //flatMap 拓展--由于可以在嵌套的 Observable 中添加异步代码， flatMap() 也常用于嵌套的异步操作，例如嵌套的网络请求。示例代码（Retrofit + RxJava）：
    public void get_flatmap(){
        Student[] students = {new Student()};
        Subscriber<Student.Course> subscriber = new Subscriber<Student.Course>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(Student.Course course) {
            }
        };
        Observable.from(students)
                .flatMap(new Func1<Student, Observable<Student.Course>>() {
                    @Override
                    public Observable<Student.Course> call(Student student) {
                        return Observable.from(student.cursou);
                    }
                })
                .subscribe(subscriber);

        //链式网络请求--嵌套的网络请求
        Student.getObservable() //1。 返回 Observable<String>，在订阅时请求 token，并在响应后发送 token  第一阶段网络请求
                .flatMap(new Func1<String, Observable<Student>>() {
                    @Override
                    public Observable<Student> call(String token) {
                        // 返回 Observable<Messages>，在订阅时请求消息列表，并在响应后发送请求到的消息列表
//                        return null;
                        return Student.getmessages();// 2。第二阶段网络请求
                    }
                })
                .subscribe(new Action1<Student>() {
                    @Override
                    public void call(Student messages) {
                        //3。 处理显示消息列表
//                        showMessages(messages);
                    }
                });
    }

}
